import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase representa al menu de juego que permite al usuario acceder a las modalidades de juego
 * 
 * @author Miguel Martinez Aguilar
 * @version 15 de Mayo del 2013
 */
public class MenuJuego extends ScrollActor
{
    // Declaracion de variables de instancia
    private InicioJuego[] boton;// es un arreglo de los botones de InicioJuego.
    private Puerta puerta;// es la puerta que da acceso al juego.
    private MenuJugador menuj;// es el menu de jugadores.
    private MenuNiveles menun;// es el menu de niveles.
    
    /**
     * Constructor de MenuJuego
     * @param puerta: la puerta que da  acceso al juego.
     * @param menun: un menu de niveles que ya exista en el escenario (puede no existir).
     */
    public MenuJuego(Puerta puerta, MenuNiveles menun)
    {
        boton = new InicioJuego[3];
        boton[0] = new InicioJuego("jugadores",0,this);
        boton[1] = new InicioJuego("niveles",1,this);
        boton[2] = new InicioJuego("menu_prin",2,this);
        this.puerta = puerta;
        menuj = null;
        this.menun = menun;
    }  
    
    /**
     * Este metodo prepara otros elementos del inicio del menu de juego
     */
    public void prepara() 
    {
        ScrollWorld mundo = super.getWorld();
        mundo.setBackground("paisaje2.png");
        mundo.setPaintOrder(BotonJug.class);
        mundo.addObject(boton[0],this.getX(),this.getY() - 150);
        mundo.addObject(boton[1],this.getX(),this.getY());
        mundo.addObject(boton[2],this.getX(),this.getY() + 150);
        mundo.setPaintOrder(Puerta.class);
        if(menun != null)menun.prepara(this);
    }
    
    /**
     * Este metodo regresa al usuario al menu principal
     */
    public void menuPrincipal() 
    {
        ScrollWorld mundo = super.getWorld();
        mundo.setBackground("paisaje1.png");
        this.quitarBotones(true);
        puerta.nuevaEscena();
    }
    
    /**
     * Este metodo quita las interfaces del menu de juego.
     * @param todo: un boleano que indica si se deben eliminar todas las interfaces.
     */
    public void quitarBotones(boolean todo) 
    {
        ScrollWorld mundo = super.getWorld();
        mundo.removeObject(boton[0]);
        mundo.removeObject(boton[1]);
        mundo.removeObject(boton[2]);
        if(menuj != null)menuj.quitarBotones(todo);
        if(menun != null)menun.quitarBotones(todo);
        mundo.removeObject(this);
    }
    
    /**
     * Este metodo agrega el menu de jugadores.
     */
    public void agregaMenuJuego() 
    {
        ScrollWorld mundo = super.getWorld();
        if(menuj == null){
            menuj = new MenuJugador(this);
            mundo.addObject(menuj, 463, 250);
            menuj.prepara();
        }
    }
    
    /**
     * Este metodo agrega el meunu de niveles.
     */
    public void agregaMenuNiveles() 
    {
        ScrollWorld mundo = super.getWorld();
        if(menun == null){
            menun = new MenuNiveles(mundo);
            this.agregaObj(menun, 463, 250);
            menun.prepara(this);
        }
    }
    
    /**
     * Este metodo verifica si existen jugadores. <p>
     * Regresa un boleano.
     * @param niveles: un boleano que indica si el menu al que se le preguntara si tiene jugadores <p>
     * es el menu niveles o el menu de jugadores.
     */
    public boolean hayJugadores(boolean niveles) 
    {
        if(niveles)return menun.hayJugadores();
        else return menuj.hayJugadores();
    }
    
    /**
     * Este metodo entrega el primer jugador. <p>
     * Regresa un Jugador.
     * @param niveles: un boleano que indica si el menu al que se le pide el jugador1 es al menu de <p>
     * niveles o al menu de jugadores.
     */
    public Jugador jugador1(boolean niveles) 
    {
        if(niveles)return menun.jugador1();
        else return menuj.jugador1();
    }
    
    /**
     * Este metodo entrega el segundo jugador. <p>
     * Regresa un jugador.
     * @param niveles: un boleano que indica si el menu al que se le pide el jugador2 es al menu de <p>
     * niveles o al menu de jugadores.
     */
    public Jugador jugador2(boolean niveles) 
    {
        if(niveles)return menun.jugador2();
        else return menuj.jugador2();
    }
    
    /**
     * Este metodo regresa la puerta. <p>
     * Regresa el objeto Puerta.
     */
    public Puerta puerta() 
    {
        return puerta;
    }
    
    /**
     * Este metodo quita un menu y lo remplaza por otro.
     * @param queMenu: un boleano que indica cual sera el menu a eliminar (menu de niveles o <p>
     * el menu de jugadores.
     */
    public void cambiaMenu(boolean queMenu) 
    {
        if(queMenu){// si es verdadero, es el menu de jugadores
            if(menun != null)menun.quitarBotones(true);
            menun = null;
        }
        else{// si es falso, es el menu de niveles
            if(menuj != null)menuj.quitarBotones(true);
            menuj = null;
        }
    }
    
    /**
     * Este metodo regresa el menu de niveles. <p>
     * Regresa el Menu de niveles.
     */
    public MenuNiveles niveles() 
    {
        return menun;
    }
    
    /**
     * Este metodo hace que este menu le pida jugadores al menu de niveles.
     */
    public void pideJugadores() 
    {
        menun.preparaJugadores();
    }
}
